#pragma once
#include "stdafx.h"
//-------------------------------------------------------------------------------------------------
//ProcParamDef.h  - Parameter Definitions for Image Processing Steps           
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2012 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk Feb 2012
//
//----Comments-------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
#ifdef IMAGEEXPTLIB_EXPORTS
#define IMAGEEXPTLIBAPI __declspec(dllexport)
#else
#define IMAGEEXPTLIBAPI __declspec(dllimport)
#endif

#include "procparam.h"

class IMAGEEXPTLIBAPI ProcParamDef 
{
friend class ImageProcFn;
public:
	static const char * const ProcParamDef::String;
	static const char * const ProcParamDef::Int;
	static const char * const ProcParamDef::Double;

	static const char * const ProcParamDef::BadValue;
	static const char * const ProcParamDef::BadDefaultValue;

	static const char * const ProcParamDef::InvalidDefaultValue;
	static const char * const ProcParamDef::InvalidDefinition;
	static const char * const ProcParamDef::InvalidValue;

	static const int MaxIndex=50;
	static const int ProcParamDef::NotFound = -1;
	enum Direction 
	{
		input = 0,
		output
	};
	enum TypeP 
	{
		stringP = 0,
		intP,
		doubleP
	};

public:
	static ProcParamDef *CreateProcParamDef(ProcParamDef *paramdef);
	virtual ~ProcParamDef(void);

	virtual bool					IsValid() = 0;
	virtual	bool					IsMatch (ProcParam *param, ProcParamDef::Direction dir) = 0;
	virtual TypeP					GetTypeP() = 0;
	virtual const char *			GetTypeStr() = 0;
	virtual const char *			GetDefaultValueStr() = 0;
	virtual const char *			GetString() = 0;

			int						GetIndex() { return _index; }						//return value even if it is invalid
			const char *			GetName() { return _Name.c_str(); }					//return value even if it is invalid
			const char *			GetDescription() { return _Description.c_str(); }	//return value even if it is invalid
			ProcParamDef::Direction GetDirection() { return _Dir; }						//return value even if it is invalid

protected:
	ProcParamDef();
	ProcParamDef(int index, const char *Name, const char *Description, ProcParamDef::Direction dir);

	virtual		bool				SetXml(void *xmlParam) = 0;
	virtual		bool				Validate() = 0;

protected:
	bool	_error;
#pragma warning(disable:4251)
	std::string _DefaultValue;
	std::string _Definition;
#pragma warning(default:4251)

private:
	int						_index;
	ProcParamDef::Direction _Dir;
#pragma warning(disable:4251)
	std::string _Name;
	std::string _Description;
#pragma warning(default:4251)
};

//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------
